﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Evan.Plugins
{
    /// <summary>
    /// 张澎 2018年6月15日16:24:54
    /// 可视化编辑类
    /// </summary>
    public static class VisualEdit
    {
        /// <summary>
        /// 张澎 2018年6月15日16:26:06
        /// 执行可视化编辑  
        /// 暂时只有编辑无可视化添加方法
        /// </summary>
        /// <param name="FieldList"></param>
        /// <returns></returns>
        public static bool vEditorExec(List<Evan.Plugins.VisualEdit.vEditItemModel> FieldList)
        {
            StringBuilder sb = new StringBuilder();
            sb.Append(" begin ");
            foreach (Evan.Plugins.VisualEdit.vEditItemModel item in FieldList)
            {
                if (Convert.ToInt32(item.Id) > 0)
                {
                    //编辑
                    sb.Append(string.Format(" UPDATE {0} SET {1} = N'{2}' WHERE Id = {3} ", item.Table, item.Field, item.Value.Replace("'", "''"), item.Id));
                }
            }
            sb.Append(" end ");

            try
            {
                //int isok = new Evan.DataBase.MsSql.DbHelper().ExecteNonQuery(System.Data.CommandType.Text, sb.ToString());
                int isok = 0;

                if (Evan.Common.CommFun.GetDateBaseType() == Evan.Model.SysModel.DateBaseType.MsSql)
                {
                    isok = new Evan.DataBase.MsSql.DbHelper().ExecteNonQuery(System.Data.CommandType.Text, sb.ToString());

                }
                else if (Evan.Common.CommFun.GetDateBaseType() == Evan.Model.SysModel.DateBaseType.MySql)
                {
                    isok = new Evan.DataBase.MySql.DbHelper().ExecteNonQuery(System.Data.CommandType.Text, sb.ToString());

                }

                return isok > 0 ? true : false;
            }
            catch (Exception ex)
            {
                Evan.SystemLog.MemLog.AddExLog2("可视化编辑SQL", null, sb.ToString());
                Evan.SystemLog.MemLog.AddExLog2("可视化编辑出错", null, ex.ToString());
                return false;
            }

        }

        #region   可视化编辑实体   2018年6月26日16:00:25
        /// <summary>
        /// 张澎  2018年6月15日16:14:13 
        /// 可视化编辑提交上来的实体类型
        /// </summary>
        public class vEditItemModel
        {
            /// <summary>
            /// 表名称
            /// </summary>
            public string Table { get; set; }
            /// <summary>
            /// ID
            /// </summary>
            public string Id { get; set; }
            /// <summary>
            /// 栏目类型 , 如果是栏目则可为空
            /// </summary>
            public string ClassId { get; set; }
            /// <summary>
            /// 字段名称
            /// </summary>
            public string Field { get; set; }
            /// <summary>
            /// 字段值
            /// </summary>
            public string Value { get; set; }
        }
        /// <summary>
        /// 可视化编辑前端使用的实体类型 , 用于使用设置可视化编辑标签
        /// 张澎 2018年6月26日16:00:44
        /// </summary>
        public class vEditAttr
        {
            //可视化属性集合

            private int _id = 0;
            private int _classid = 0;
            private vEditAttrType _type = vEditAttrType.HTML;
            private string _field = "";
            private string _table = "";
            private string _default = "";
            private dynamic _curchannel = null;
            private Evan.DataBase.DbOperat _curoperat = null;

            /// <summary>
            /// 数据ID , 通常是当前数据 , 如果是添加的话 , 此处为0
            /// 如果编辑的是栏目 , 则此处为栏目ID
            /// </summary>
            public int Id
            {
                set { _id = value; }
                get { return _id; }
            }

            /// <summary>
            /// 栏目id  , 如果不填默认使用 curChannel.Id [ 则curChannel必须指定 ] , 且不能为 0 如果是编辑栏目的话 , 可为 0 
            /// </summary>
            public int ClassId
            {
                set { _classid = value; }
                get { return _classid; }
            }

            /// <summary>
            /// 编辑项目的类型  默认 html 类型
            /// </summary>
            public vEditAttrType Type
            {
                set { _type = value; }
                get { return _type; }
            }

            /// <summary>
            /// 字段名称 , 必填, 不能为空 , 否则报错
            /// </summary>
            public string Field
            {
                set { _field = value; }
                get { return _field; }
            }

            /// <summary>
            /// 表名称 , 必填 
            /// </summary>
            public string Table
            {
                set { _table = value; }
                get { return _table; }
            }

            /// <summary>
            /// 默认值 , 如果是添加的话使用此项 定义当前字段的默认值
            /// </summary>
            public string Default
            {
                set { _default = value; }
                get { return _default; }
            }

            /// <summary>
            /// 当前栏目的对象 , 默认null , 如果是编辑栏目的话可为空
            /// </summary>
            public dynamic curChannel
            {
                set { _curchannel = value; }
                get { return _curchannel; }
            }

            /// <summary>
            /// 当前的操作对象 , 通常是Base中的 curBLL , 传进来的是个已经实例化的数据库操作对象  如果是编辑栏目的话可为空
            /// 例如  new Evan.DataBase.DbOperat("Article")
            /// </summary>
            public Evan.DataBase.DbOperat curOperat
            {
                set { _curoperat = value; }
                get { return _curoperat; }
            }

        }
        
        /// <summary>
        /// 编辑类型的枚举
        /// </summary>
        public enum vEditAttrType
        {
            /// <summary>
            /// Html格式 , 通常是编辑器中的内容 , 此属性取 内容的 html , 带格式
            /// </summary>
            HTML = 1,
            /// <summary>
            /// 普通文本格式 , 通常是标题类的单行文本内容 , 此属性会取内容的text  不带html格式
            /// </summary>
            TEXT = 2,
            /// <summary>
            /// 图片上传 , 仅仅取src
            /// </summary>
            IMAGE = 3,
            /// <summary>
            /// 背景图 通常是使用 background设置的图片 , 取 background-image src 属性
            /// </summary>
            BACKGROUNDIMG = 4
        }
        #endregion

        #region 可视化编辑权限
        /// <summary>
        /// 控制可视化编辑的权限
        /// </summary>
        /// <param name="vedit"></param>
        /// <param name="ClassId"></param>
        /// <param name="curId"></param>
        /// <returns></returns>
        public static bool vEditRole(string vedit, int ClassId, int curId)
        {
            bool Page_Is_Edit = false;
            if (vedit == "true")
            {
                //判断是否管理员登录
                if (Evan.Member.Administrator.IsAdminLogin())
                {
                    //判断当前管理员是否拥有对应权限
                    bool hasRole = false;
                    if (ClassId > 0)
                    {
                        //编辑常规内容
                        if (curId > 0)
                        {
                            //编辑内容
                            hasRole = Evan.Member.Administrator.HasRole(1, ClassId.ToString(), "", "update");
                        }
                        else
                        {
                            //增加内容
                            hasRole = Evan.Member.Administrator.HasRole(1, ClassId.ToString(), "", "add");
                        }
                    }
                    else
                    {
                        //编辑到了系统表 , 一般系统表可视化编辑的只能是channel
                        hasRole = Evan.Member.Administrator.HasRole(0, "0", "channel", "");
                    }
                    //上面所有可能性判断完成后 , 进行管理员和权限的双重验证
                    Page_Is_Edit = hasRole;
                }
            }
            return Page_Is_Edit;
        }
        #endregion


        #region 可视化编辑属性
        public static string vEdit(Evan.Plugins.VisualEdit.vEditAttr Attr)
        {
            //是管理员账号  且对当前栏目有操作权限  classid 不为空
            if (Evan.Member.Administrator.IsAdminLogin())
            {
                
                if (string.IsNullOrEmpty(Attr.Table))
                {
                    Attr.Table = Evan.Template.TemplateHelper.GetTableNameByPageType(Attr.curChannel.PageType);
                }

                if (string.IsNullOrEmpty(Attr.Field))
                {
                    throw new Exception("字段名称不允许为空");
                }
                if (Attr.ClassId == 0)
                {
                    //如果为0 的话 先看table是否为Channel
                    if (Attr.Table.ToString().ToUpper() != "Channel".ToUpper())
                    {
                        //如果不是栏目表的话  这里不能为空
                        Attr.ClassId = Attr.curChannel.Id;
                    }
                }
                //字段类型不可能为空 因为枚举必须设置默认值
                //if (Attr.Type == null)
                //{
                //    throw new Exception("字段类型不允许为空");
                //}
                if (Attr.Id == 0)
                {
                    if (Convert.ToInt32(Attr.curChannel.PageType) == 3) //单页
                    {
                        dynamic _curModel_Temp = Attr.curOperat.GetModel_1(" ClassId=@ClassId and States=1 ", Attr.ClassId);
                        Attr.Id = _curModel_Temp.Id;
                    }
                }

                if (Attr.Id == 0)
                {
                    //添加的时候需要拿到default 中的标识去对应的数据中取数据回来 并且经过转码后存进去
                    Attr.Default = Evan.Common.TransCode.StrEnCode(Attr.Default);
                }

                if (Attr.Id == 0)
                {
                    //添加操作
                    return string.Format(" data-visual=\"true\" data-visual-table=\"{0}\" data-visual-field=\"{1}\" data-visual-type=\"{2}\" data-visual-id=\"{3}\" data-visual-classid=\"{4}\" data-visual-default=\"{5}\" ", Attr.Table, Attr.Field, Attr.Type, Attr.Id, Attr.ClassId, Attr.Default);
                }
                else
                {
                    //编辑操作
                    return string.Format(" data-visual=\"true\" data-visual-table=\"{0}\" data-visual-field=\"{1}\" data-visual-type=\"{2}\" data-visual-id=\"{3}\" data-visual-classid=\"{4}\" ", Attr.Table, Attr.Field, Attr.Type, Attr.Id, Attr.ClassId);
                }

            }
            else
            {
                return "";
            }
        }
        #endregion

    }
}
